package com.zw.mes.module.transpositionManager.service;


import com.zw.mes.common.JsonResult;
import com.zw.mes.entity.sys.Dept;
import com.zw.mes.entity.sys.User;
import com.zw.mes.module.prodtaskmanager.entity.ProdOrd;
import com.zw.mes.module.prodtaskmanager.entity.ProdPla;
import com.zw.mes.module.prodtaskmanager.entity.ProdPlaRet;
import com.zw.mes.module.prodtaskmanager.mapper.ProdTaskMapper;
import com.zw.mes.module.system.service.LogService;
import com.zw.mes.module.transpositionManager.mapper.TranspositionCutMapper;
import com.zw.mes.module.transpositionManager.model.FlowRouteModel;
import com.zw.mes.module.transpositionManager.model.FlowSheetModel;
import com.zw.mes.module.transpositionManager.model.FlowTransModel;
import com.zw.mes.util.ServletUtils;
import com.zw.mes.util.ShiroUtils;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;

/**
 * @className: TranspositionCutService
 * @description: 生产转序下料维护业务逻辑层
 * @author： 徐一贺 18341916590
 * @date： 2021/4/16 16:47
 * @office: 智能控制设计科
 * @research institute： 智能控制设计所
 * @department： 机械设计院
 * @company: 辽宁忠旺机械设备制造有限公司
 * @group： 忠旺集团
 * @version: 1.0
 */
@Log4j2
@Service
public class TranspositionCutService {
    @Autowired
    private TranspositionCutMapper mapper;
    @Autowired
    private ProdTaskMapper prodTaskMapper;
    @Autowired
    private LogService logService;

    /**
     * @methodName: findCutListByPrarm
     * @description: 加载下料维护页列表
     * @param: param 搜索条件
     * @return： java.util.List<com.zw.mes.module.transpositionManager.model.FlowSheetModel>
     * @exception： 已捕获
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/4/17 8:09
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    public List<FlowSheetModel> findCutListByParam(FlowSheetModel param) {
        return mapper.findCutListByParam(param);
    }

    /**
     * @methodName: operCutNecessary
     * @description: 执行下料
     * @param: idStr id们
     * @return： com.zw.mes.common.JsonResult
     * @exception： 已捕获
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/4/17 8:54
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    @Transactional(rollbackFor = Exception.class)
    public JsonResult operCutNecessary(FlowSheetModel param) {
        JsonResult jsonResult = new JsonResult();
        Date currentDate = new Date();
        ProdOrd prodOrd = mapper.getProdOrdByProdNo(param.getProdNo());
        try {
            Set<String> prodNoSet = new HashSet<String>();
            List<FlowSheetModel> flowSheetModelList = mapper.findFlowSheetModelListByIdParam(param);
            for (FlowSheetModel flowSheetModel : flowSheetModelList) {
                if(prodOrd.getProdTyp()==1){
                    ProdPla prodPla = mapper.getProdPlaByProdNo(flowSheetModel.getProdNo());
                    if (prodPla == null) {
                        jsonResult.setType(JsonResult.ResultType.ERROR);
                        jsonResult.setMsg("生产令【"+flowSheetModel.getProdNo()+"】未做包含下料计划的总调计划，无法下料！");
                        return jsonResult;
                    }else{
                        if(prodPla.getPropSta()!=5){
                            jsonResult.setType(JsonResult.ResultType.ERROR);
                            jsonResult.setMsg("生产令【"+flowSheetModel.getProdNo()+"】的总调计划未审核通过，无法下料！");
                            return jsonResult;
                        }else{
                            ProdPlaRet prodPlaRetParam = new ProdPlaRet();
                            prodPlaRetParam.setPrprPropId(prodPla.getPropId());
                            prodPlaRetParam.setPrprCod("r09");
                            ProdPlaRet prodPlaRet = mapper.getProdPlaRetByParam(prodPlaRetParam);
                            if(prodPlaRet == null){
                                jsonResult.setType(JsonResult.ResultType.ERROR);
                                jsonResult.setMsg("生产令【"+flowSheetModel.getProdNo()+"】未做包含下料计划的总调计划，无法下料！");
                                return jsonResult;
                            }
                        }
                    }
                }
                if (flowSheetModel.getCutStatus() == null || flowSheetModel.getCutStatus() == 0) {
                    //根据条件 获取对应的首序为原料的路线列表
                    FlowRouteModel condition = new FlowRouteModel();
//                    condition.setRoute("原料");
                    condition.setOrderNo(10);
                    condition.setSheetId(flowSheetModel.getId());
                    condition.setStatus(1);
                    //下料列表
                    List<FlowRouteModel> routeList = mapper.findFlowRouteModelByCondition(condition);
                    //遍历路线对路线的状态修改成全部接收，接收数量来自flow_sheet表的零件数量，申请数量等于接收数量,质检数量等于申请数量，可接收数量为0
                    for (FlowRouteModel route : routeList) {
                        if (route.getRoute().equals("原料")) {
                            route.setStatus(4);
                            route.setRecNum(flowSheetModel.getDrawNum());
                            route.setApplyNum(route.getRecNum());
                            route.setCheckNum(route.getApplyNum());
                            route.setMayApplyNum(0);
                            route.setRouteDate(currentDate);
                            //创建对应的转序单表数据 直接设置成转序完成并写入申请人和质检人信息，默认为非让步。
                            FlowTransModel trans = new FlowTransModel();
                            trans.setRouteId(route.getId());
                            trans.setNum(route.getApplyNum());
                            User u = ShiroUtils.getUser();
                            trans.setApplyCode(u.getAccount());
                            trans.setApplyName(u.getName());
                            trans.setApplyTime(currentDate);
                            Dept dept = mapper.getDeptByPrimaryKey(u.getDeptId());
                            if (dept != null) {
                                trans.setApplyDept(dept.getName());
                            }
                            trans.setIsDel(0);
                            trans.setStatus(2);//修改数据时，本次需要修改下料后生产的转序单状态为已完成（3）
                            trans.setCheckCode(u.getAccount());
                            trans.setCheckName(u.getName());
                            if (dept != null) {
                                trans.setCheckDept(dept.getName());
                            }
                            trans.setCheckTime(currentDate);
                            trans.setYield(0);
                            mapper.insertTrans(trans);
                        } else {
                            route.setStatus(2); //修改下料数据时，本处需要修改路线状态为已完成（4）
                            route.setRecNum(0);
                            route.setApplyNum(0);
                            route.setCheckNum(0);
                            route.setMayApplyNum(flowSheetModel.getDrawNum());
                            route.setRouteDate(null);
                        }
                        mapper.updateFlowRouteByPrimaryKey(route);
                    }
                    flowSheetModel.setCutStatus(1);
                    //修改下料状态
                    mapper.updateFlowSheetModelCutStatus(flowSheetModel);
                    logService.saveLog("下料任务维护-下料", "生产令编号为【" + flowSheetModel.getProdNo() + "】，项目名称为【" + flowSheetModel.getProName() + "】，数量为【" + flowSheetModel.getDrawNum() + "】，类型为【" + flowSheetModel.getSpecial() + "】，部分为【" + flowSheetModel.getPart() + "】的工艺卡清单下料状态被设置成【下料】。");
                    prodNoSet.add(flowSheetModel.getProdNo());
                }
            }
            if(prodOrd.getProdTyp()==1) {
                Iterator iterator = prodNoSet.iterator();
                while (iterator.hasNext()) {
                    ProdPla prodPla = mapper.getProdPlaByProdNo((String) iterator.next());
                    ProdPlaRet prodPlaRet = new ProdPlaRet();
                    prodPlaRet.setPrprPropId(prodPla.getPropId());
                    prodPlaRet.setPrprCod("r09");
                    prodPlaRet = mapper.getProdPlaRetByPrprIdAndPrprCod(prodPlaRet);
                    prodPlaRet.setPrprRetDat(currentDate);
                    prodTaskMapper.updateProdPlaRetPrprRetDatByPrimaryKey(prodPlaRet);
                    ProdOrd changeProdCodSta = mapper.getProdOrdByProdNo(prodPla.getPropProdNo());
                    changeProdCodSta.setProdCodSta(2);
                    mapper.updateProdOrdProdCodStaByPrimaryKeyAndNotStarted(changeProdCodSta);
                }
            }
            jsonResult.setType(JsonResult.ResultType.SUCCESS);
            jsonResult.setMsg("下料成功！");
        } catch (Exception e) {
            e.printStackTrace();
            log.error("执行下料异常：" + e.getMessage());
            jsonResult.setType(JsonResult.ResultType.ERROR);
            jsonResult.setMsg("下料失败！");
        }
        return jsonResult;
    }


    /**
     * @methodName: operCutUnwanted
     * @description: 执行下料不需要
     * @param: idStr id们
     * @return： com.zw.mes.common.JsonResult
     * @exception： 已捕获
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/4/17 10:28
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    @Transactional(rollbackFor = Exception.class)
    public JsonResult operCutUnwanted(FlowSheetModel param) {
        JsonResult jsonResult = new JsonResult();
        try {
            List<FlowSheetModel> flowSheetModelList = mapper.findFlowSheetModelListByIdParam(param);
            for (FlowSheetModel flowSheetModel : flowSheetModelList) {
                if (flowSheetModel.getCutStatus() == null || flowSheetModel.getCutStatus() == 0) {
                    flowSheetModel.setCutStatus(2);
                    //修改下料状态
                    mapper.updateFlowSheetModelCutStatus(flowSheetModel);
                    logService.saveLog("下料任务维护-不需要下料", "生产令编号为【" + flowSheetModel.getProdNo() + "】，项目名称为【" + flowSheetModel.getProName() + "】，数量为【" + flowSheetModel.getDrawNum() + "】，类型为【" + flowSheetModel.getSpecial() + "】，部分为【" + flowSheetModel.getPart() + "】的工艺卡清单被下料状态设置为【不需要】。");
                }
            }
            if(flowSheetModelList.size()>0){
                ProdOrd changeProdCodSta = mapper.getProdOrdByProdNo(param.getProdNo());
                changeProdCodSta.setProdCodSta(2);
                mapper.updateProdOrdProdCodStaByPrimaryKeyAndNotStarted(changeProdCodSta);
            }
            jsonResult.setType(JsonResult.ResultType.SUCCESS);
            jsonResult.setMsg("操作成功！");
        } catch (Exception e) {
            e.printStackTrace();
            log.error("执行下料不需要异常：" + e.getMessage());
            jsonResult.setType(JsonResult.ResultType.ERROR);
            jsonResult.setMsg("操作失败！");
        }
        return jsonResult;
    }

    /**
     * @methodName: findCutListsByParams
     * @description: 根据多个条件获取下料列表
     * @param: flowSheetModelList
     * @return： java.util.List<com.zw.mes.module.transpositionManager.model.FlowSheetModel>
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/5/11 13:11
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    public List<FlowSheetModel> findCutListsByParams(List<FlowSheetModel> flowSheetModelList) {
        List<FlowSheetModel> list = new ArrayList<>();
        for (int i = 0; i < flowSheetModelList.size(); i++) {
            list.add(mapper.getFlowSheetModelByParamsGroupByParams(flowSheetModelList.get(i)));
        }
        return list;
    }

    /**
     * @methodName: getProdPlaByProdNo
     * @description: 根据生产令编号获取总调计划
     * @param: prodNo 生产令编号
     * @return： com.zw.mes.module.prodtaskmanager.entity.ProdPla
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/6/2 14:11
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    public ProdPla getProdPlaByProdNo(String prodNo) {
        return mapper.getProdPlaByProdNo(prodNo);
    }

    /**
     * @methodName: getProdPlaRetByPrprIdAndPrprCod
     * @description: 根据总调计划主键和计划反馈码获取反馈信息
     * @param: prodPlaRet
     * @return： com.zw.mes.module.prodtaskmanager.entity.ProdPlaRet
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/6/2 14:16
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    public ProdPlaRet getProdPlaRetByPrprIdAndPrprCod(ProdPlaRet prodPlaRet) {
        return mapper.getProdPlaRetByPrprIdAndPrprCod(prodPlaRet);
    }

    /**
     * @methodName: updateProdPlaRetPrprRetDatByPrimaryKey
     * @description: 根据主键更新反馈时间
     * @param: prodPlaRet
     * @return： int
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/6/2 14:21
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    public int updateProdPlaRetPrprRetDatByPrimaryKey(ProdPlaRet prodPlaRet) {
        return prodTaskMapper.updateProdPlaRetPrprRetDatByPrimaryKey(prodPlaRet);
    }

    /**
     * 将不需要的下料项目修改为需要
     * @param flow
     * @return
     */
    public JsonResult updateOperCutFlow(FlowSheetModel flow) {
        JsonResult jsonResult = new JsonResult();
        try {
            List<FlowSheetModel> flowSheetModelList = mapper.findFlowSheetModelListByIdParam(flow);
            for (FlowSheetModel flowSheetModel : flowSheetModelList) {
                if (flowSheetModel.getCutStatus() == 2) {
                    flowSheetModel.setCutStatus(0);
                    //修改下料状态
                    mapper.updateFlowSheetModelCutStatus(flowSheetModel);
                    logService.saveLog("下料任务维护-需要下料", "生产令编号为【" + flowSheetModel.getProdNo() + "】，项目名称为【" + flowSheetModel.getProName() + "】，数量为【" + flowSheetModel.getDrawNum() + "】，类型为【" + flowSheetModel.getSpecial() + "】，部分为【" + flowSheetModel.getPart() + "】的工艺卡清单被下料状态设置为【需要】。");
                }
            }
            jsonResult.setType(JsonResult.ResultType.SUCCESS);
            jsonResult.setMsg("操作成功！");
        } catch (Exception e) {
            e.printStackTrace();
            log.error("执行下料不需要异常：" + e.getMessage());
            jsonResult.setType(JsonResult.ResultType.ERROR);
            jsonResult.setMsg("操作失败！");
        }
        return jsonResult;
    }

    public int selectCutMaintainCount() {
        return  mapper.selectCutMaintainCount();
    }
}
